package com.dxf.chepter09

/**
 *  match 模式匹配 比java的switch 更加强大
 *
 *  语法:
 *    采用match 关键字 每个分支采用case 关键字进行声明,当需要匹配时,会从第一个case分支开始,
 *    如果匹配成功.执行对应逻辑代码,匹配失败.继续执行下一个分支判断,如果所有case都不匹配
 *    执行 case _ 分支,类似java中的default
 *
 *    ======================================
 *
 *    注意事项
 *    1 如果没有匹配到 异常  scala.MatchError
 *    2 => 后面可以是代码块
 *    3 case 匹配可以任意类型
 *    4 case 可以对一个点的匹配,也可以对一个范围匹配(可以if语句) ==> 守卫
 *
 *
 *    =========================================
 *
 *
 *    守卫:
 *
 *    如果想要表达匹配某个范围的数据,需要再匹配模式中增加条件守卫
 *
 *    即 scala的match 可以对一个点的匹配,也可以对一个范围的匹配
 *
 *
 *
 *
 *
 *    可以在case 后面添加语法    case _ if oper.toString.equals("8") => println("ok8")    -->守卫  oper.toString.equals("8")
 *  =========================================================
 *
 *  match中的case:
 *    ch match {
 *      //aaa 可以看成是 ch 即   aaa = ch  => println()
 *      case aaa => println()
 *    }
 *
 *  match 在scala中是一个表达式,可以进行类型匹配 ,避免 isInstanceOf[T] 和asInstanceOf[T]
 *    case '+' => ch + 'hello'
 *
 *  match匹配注意事项:
 *       1 Map[String ,Int]  和 Map[Int,String] 是两种不同类型,其它结构类似
 *       2 在进行类型匹配时,编译器会预先检测是否有可能匹配,如果不能匹配会报错
 *       3 case i:Int => i    意思是把i = obj ,再判断类型  即 (i=obj) :Int  => i
 *       4 case_ 出现在match中间,表示隐藏变量名,即不使用,而不是表示默认匹配
 *
 *
 *
 */
object T109_模式匹配match_match中的变量 {


  def main(args: Array[String]): Unit = {
    val ch = 'v'
    ch match {
      case '+' => println('+')
      //case _ => println("all01")
      case mychar => println("mychar")
      case _ => println("all")
    }

    val ch1 = '+'
    var res = ch1 match {
      case '+' => ch1 + "hello"
      case _ => println("all")
    }
    println(res)

    val a = 7
    val obj = if (a == 1) "1"
    else if (a == 2) "2"
    else if (a == 3) true
    else if (a == 4) Map("aa" -> 1)
    else if (a == 5) List("bb", "cc", "dd")
    else if (a == 6) Array(1, 2, 3)
    else "2"

    //根据obj的类型匹配
    val result = obj match {
      case a: Int => a
      case b: Map[String, Int] => "是map"
      case c: Array[Int] => "是数组"
      case d:String => "是字符串"
      case e:String => e+"!!"
    }


    println(result)


    val obj3:Any =10
    var result3 = obj3 match {
      case b:Map[String,String] => "map[string,string]集合"
    }



  }


}
